package Client.netty.handler;

import common.Message.RpcResponse;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.AttributeKey;

/**
 * Netty中用户处理服务器端响应的处理器，接受RpcResponse对象，管理连接生命周期
 */
public class NettyClientHandler extends SimpleChannelInboundHandler<RpcResponse> {

    /**
     * @param channelHandlerContext IO操作上下文
     * @param rpcResponse 返回响应信息
     * @throws Exception 抛异常
     */
    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, RpcResponse rpcResponse) throws Exception {

        // 接受response，channel设置别名，NettyClient 调用sendRequest方法，会根据设置的别名获取channel，然后发送请求
        AttributeKey<RpcResponse> key = AttributeKey.valueOf("RPCResponse");
        // 服务端返回的RpcResponse绑定到当前Channel属性
        channelHandlerContext.channel().attr(key).set(rpcResponse);
        // 关闭当前Channel，短连接
        channelHandlerContext.channel().close();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        // 异常处理
        cause.printStackTrace();
        ctx.close();
    }
}
